# 这个是输出错误信息的
import logging
import logging.handlers
from flask import request
import os


class RequestShoppingFormatter(logging.Formatter):
    """
    自定义的日志输出格式
    """

    def format(self, record):
        record.url = request.url  # 需要在日志中记录请求地址
        record.remote_addr = request.remote_addr  # 记录用户的IP地址
        return super().format(record)  # 返回继承父类的方法


# 创建一个个性化的logging对象
def create_logging(app):
    """
    设置日志配置
    这个app是Flask中的App对象
    """
    logging_file_dir = app.config['LOGGING_FILE_DIR']  # 日志文件目录
    logging_file_max_bytes = app.config['LOGGING_FILE_MAX_BYTES']  # 日志文件最大容量
    logging_file_backup = app.config['LOGGING_FILE_BACKUP']  # 日志文件备份个数
    logging_level = app.config['LOGGING_LEVEL']  # 默认日志文件级别

    # 设置日志文件输出格式（争对文件）
    request_formatter = RequestShoppingFormatter(
        # 时间           ip               url地址           日志级      那个模块中      行号        日志信息
        '[%(asctime)s] %(remote_addr)s 请求%(url)s \t %(levelname)s  在%(module)s %(lineno)d  :%(message)s')

    # 检测如果文件不存在我们就创建目录
    if os.path.isdir(logging_file_dir):
        pass

    else:
        os.mkdir(logging_file_dir)  # 如果文件不错在我们就创建文件

    # 自定义一个目录和日志文件
    flask_file_handler = logging.handlers.RotatingFileHandler(filename=os.path.join(logging_file_dir, 'shopping.log'),
                                                              maxBytes=logging_file_max_bytes,
                                                              backupCount=logging_file_backup,
                                                              )

    # 给当前的handler设置格式
    flask_file_handler.setFormatter(request_formatter)
    # 得到一个logging对象
    flask_logger = logging.getLogger('Shopping')
    flask_logger.addHandler(flask_file_handler)
    # 设置默认级别
    flask_logger.setLevel(logging_level)

    # 整个项目需要两个handler:一个文件，一个控制台
    flask_console_handler = logging.StreamHandler()  # 默认的一个输出方式
    flask_console_handler.setFormatter(
        logging.Formatter('[%(asctime)s] %(remote_addr)s %(levelname)s 在%(module)s %(lineno)d  :%(message)s'))
    # 当项目运行环境是debug，才用控制台输出
    if app.debug:
        flask_logger.addHandler(flask_console_handler)



# import logging
# import logging.handlers
# from flask import request
# import os
#
# class RequestShoppingFormatter(logging.Formatter):
#     """
#     自定义的日志输出格式
#     """
#     def format(self, record): # 初始化父类方法
#         record.url = request.url # 需要在日志中记住请求地址
#         record.remote_addr = request.remote_addr # 记住客户端ip地址
#         return super().format(record)
#
#
# # 创建一个个性化的logger对象
# def create_logger(app):
#     """
#     设置日志的配置
#     :param app: Flask中的app对像
#     :return:
#     """
#     logging_file_dir = app.config['LOGGING_FILE_DIR'] # 日志文件所在的目录
#     logging_file_max_bytes = app.config['LOGGING_FILE_MAX_BYTES'] # 日志文价最大的大小
#     logging_file_backup = app.config['LOGGING_FILE_BACKUP'] # 保留备份日志文件的个数
#     logging_level = app.config['LOGGING_LEVEL'] # 默认日志级别
#
#     # 拿到这四个参数，需要输出日志格式(针对文件)             asctime 时间    remote_addr客户端地址 url地址   levename日志等级  module在那个文件里     lineno 在第几行 message 错误信息
#     request_formatter = RequestShoppingFormatter(
#         '[%(asctime)s] %(remote_addr)s 请求%(url)s \t %(levelname)s 在 %(module)s %(lineno)d : %(message)s')
#
#     # 检测如果这个文件不存在，则创建目录
#     if os.path.isdir(logging_file_dir):
#         pass
#     else:
#         os.mkdir(logging_file_dir) # 如果目录不存在就创建
#
#
#
#
#     # 错误信息保存的位置 # 自定义一个目录和日志文件
#     flask_file_handler = logging.handlers.RotatingFileHandler(filename=os.path.join(logging_file_dir,'shopping.log'),
#                                          maxBytes=logging_file_max_bytes,
#                                          backupCount=logging_file_backup,
#                                          )
#
#     # 给当前的handler设置格式
#     flask_file_handler.setFormatter(request_formatter)
#
#     # 得到一个logger对象
#     flask_logger = logging.getLogger('Shopping')
#     flask_logger.addHandler(flask_file_handler)
#     flask_logger.setLevel(logging_level)
#
#     # 预计这个项目需要两个handler:文件，控制台
#     flask_console_handler = logging.StreamHandler() # 这是默认的handler
#     flask_console_handler.setFormatter(logging.Formatter('[%(asctime)s] %(levelname)s %(module)s %(lineno)d : %('
#                                                          'message)s'))
#
#     # 当项目运行环境是debug，才会在控制台输出
#     if app.debug:
#         flask_logger.addHandler(flask_console_handler)
